//
//  "$Id: Burn.h 23082 2011-04-11 01:57:14Z wang_haifeng $"
//
//  Copyright (c)1992-2007, ZheJiang Dahua Technology Stock CO.LTD.
//  All Rights Reserved.
//
//	Description:
//	Revisions:		Year-Month-Day  SVN-Author  Modification
//

#ifndef __BURN_API_H__
#define __BURN_API_H__

#include "Types.h"
#include "Defs.h"

#ifdef __cplusplus
extern "C" {
#endif

/// \defgroup BurnerAPI API Burner
/// 刻录设备接口，支持将文件刻录到CD/DVD等各种设备。
/// @{

/// 刻录文件结构，32字节
typedef struct BurnFile
{
	const char* name;	///< 待刻录的文件名，包括相对路径。
	uint64	length;		///< 文件长度，字节为单位
	int		reserved[4];///< 保留字节
} BurnFile;


/// 刻录刻录接口，128个指针
typedef struct Burner
{
	/// 底层私有数据
	void *priv;


	/// 增加接口引用
	int (*addRef)(struct Burner *thiz);


	/// 释放接口
	int (*release)(struct Burner *thiz);


	/// 设置文件列表，并开始刻录。
	///
	/// \param [in] thiz 本接口指针
	/// \param [in] fileList 存放待刻录文件信息的BurnFile数组。
	/// \param [in] count 待刻录文件的个数。
	/// \retval 0  开始成功
	/// \retval <0  开始失败
	int (*start)(struct Burner* thiz, BurnFile *fileList, ulong count);


	/// 停止刻录，如果正在刻录则中止刻录。
	///
	/// \param [in] thiz 本接口指针
	/// \param [in] ejectFlag 对光驱设备有效，1弹出盘片，0不弹出；非光驱设备无效
	/// \retval 0  停止成功
	/// \retval <0  停止失败
	int (*stop)(struct Burner* thiz, int ejectFlag);


	/// 打开刻录文件，必须在此文件刻录完并关闭后才能再次打开新文件。
	///
	/// \param [in] thiz 本接口指针
	/// \param [in] pFile 待文件的信息
	/// \retval 0  停止成功
	/// \retval <0  停止失败
	int (*fileOpen)(struct Burner* thiz, BurnFile * file);


	/// 将数据写到刻录设备。各个文件的数据是按顺序连续写入的。
	///
	/// \param [in] thiz 本接口指针
	/// \param [in] buffer 待写入的数据缓冲指针。
	/// \param [in] length 待写入的数据长度。
	/// \retval 0  写入成功
	/// \retval -1　 写入失败
	int (*fileStuff)(struct Burner* thiz, uchar * buffer, ulong length);


	/// 关闭刻录文件。
	///
	/// \param [in] thiz 本接口指针
	/// \retval 0  停止成功
	/// \retval <0  停止失败
	int (*fileClose)(struct Burner* thiz);


	/// 擦除光盘数据。
	/// 
	/// \param [in] thiz 本接口指针
	/// \retval 0  擦除成功
	/// \retval <0  擦除失败
	int (*erase)(struct Burner* thiz);


	/// 取得光盘容量信息。
	/// 
	/// \param [in] thiz 本接口指针
	/// \param [out] total 存放总容量的变量指针，以字节为单位
	/// \param [out] freespace 存放剩余容量的变量指针，以字节为单位
	/// \retval 0  获取成功
	/// \retval <0  获取失败
	int (*getCapacity)(struct Burner* thiz, uint64* total, uint64* freespace);


	/// 保留
	void* reserved[118];


} Burner;


/// 刻录设备接口描述，32位系统下128字节
typedef struct BurnerDesc
{
	const char*  name;	///< 刻录设备的分区名称，"/dev/sg1", "/dev/sg2"...
	int reserved[31];	///< 保留
} BurnerDesc;


/// 创建刻录接口
///
/// \param [in] desc 刻录设备接口描述结构 BurnerDesc 指针
/// \param [out] burn 刻录刻录刻录接口指针的指针
/// \retval <0 创建失败
/// \retval 0 创建成功
int PAL_API createBurner(BurnerDesc* desc, Burner** burn);


/// @} end of group

#ifdef __cplusplus
}
#endif

#endif //__BURN_API_H__

